﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using StarsAdmin.Core.DB.Entities;

namespace StarsAdmin.Core.DB.Configs
{
    public class UserConfig : IEntityTypeConfiguration<UserEntity>
    {
        public void Configure(EntityTypeBuilder<UserEntity> builder)
        {
            builder.ToTable("T_Users");

            builder.Property(e => e.Name).IsRequired(false).HasMaxLength(64);
            builder.Property(e => e.UserName).IsRequired().HasMaxLength(64);
            builder.Property(e => e.NickName).IsRequired(false).HasMaxLength(64);
            builder.Property(e => e.Description).IsRequired(false).HasMaxLength(256);
            builder.Property(e => e.Avatar).IsRequired(false);
            builder.Property(e => e.Address).IsRequired(false);
            builder.Property(e => e.Email).IsRequired().HasMaxLength(64).IsUnicode(false);
            builder.Property(e => e.PhoneNumber).IsRequired().HasMaxLength(64).IsUnicode(false);
            builder.Property(e => e.PasswordSalt).IsRequired().HasMaxLength(64).IsUnicode(false);
            builder.Property(e => e.PasswordHash).IsRequired().HasMaxLength(256).IsUnicode(false);

            // 为 UserName 字段添加非聚集索引
            builder.HasIndex(e => e.UserName).HasDatabaseName("IX_User_UserName").IsClustered(false);
            //builder.HasIndex(e => e.IsEnabled).HasDatabaseName("IX_User_IsEnabled").IsClustered(false);

            // 用户角色多对多配置
            builder.HasMany(u => u.Roles).WithMany(r => r.Users).UsingEntity<UserRoleEntity>(m =>
            {
                m.ToTable("T_UsersRoles");
                // 为 UserId 和 RoleId 字段添加复合索引
                m.HasIndex(ur => new { ur.UserId, ur.RoleId }).HasDatabaseName("IX_UserRoles_UserId_RoleId");
            });

            // 批量导入添加时简化操作使用，故忽略
            builder.Ignore(p => p.RoleIds);
        }

        //public void Configure(EntityTypeBuilder<UserEntity> builder)
        //{
        //    // 基础表结构
        //    builder.ToTable("T_Users", t => t.HasComment("系统用户主表"));

        //    // 身份字段组
        //    builder.Property(e => e.UserName).IsRequired().HasMaxLength(64)
        //        .HasAnnotation("Unicode", false);
        //    builder.Property(e => e.Email).IsRequired().HasMaxLength(64)
        //        .HasAnnotation("Regex", @"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$");

        //    // 唯一性约束
        //    builder.HasIndex(e => e.Email).IsUnique().HasDatabaseName("UX_User_Email");
        //    builder.HasIndex(e => e.PhoneNumber).IsUnique().HasDatabaseName("UX_User_Phone");

        //    // 安全存储优化
        //    builder.Property(e => e.PasswordHash)
        //        .HasColumnType("varbinary(128)")
        //        .HasConversion(
        //            hash => Convert.FromBase64String(hash),
        //            bytes => Convert.ToBase64String(bytes));

        //    // 关系配置
        //    builder.HasMany(u => u.Roles)
        //        .WithMany(r => r.Users)
        //        .UsingEntity<UserRoleEntity>(m =>
        //        {
        //            m.ToTable("T_UsersRoles", t => t.HasComment("用户角色关联表"));
        //            m.HasIndex(ur => ur.UserId).HasDatabaseName("IX_UserRoles_UserId");
        //            m.HasIndex(ur => ur.RoleId).HasDatabaseName("IX_UserRoles_RoleId");
        //        });

        //    // 软删除优化
        //    builder.HasQueryFilter(u => !u.IsDeleted);
        //    builder.HasIndex(e => e.IsDeleted)
        //        .HasDatabaseName("IX_User_IsDeleted")
        //        .HasFilter("[IsDeleted] = 1");
        //}
    }
}